﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Linq;
using NHibernate.Criterion;
using System.Linq.Expressions;
using System.Reflection;
using System.Linq.Dynamic;
using Entidades;
using Common;
using Persistence;

namespace Persistencia.Repositorios
{
    public class UsuarioRepositorio
    {
        private readonly ISession _session;

        #region Constructors

        /// <summary>
        /// Constructor por defecto
        /// </summary>
        public UsuarioRepositorio()
        {
            try
            {
                _session = NHibernateSessionHelper.GetSession();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Devuelve un Usuario según su Id
        /// </summary>
        /// <param name="Id_Usuario"></param>
        /// <returns></returns>
        public Usuario ObtenerUsuario(int Id_Usuario)
        {
            var usuario = new Usuario();
            try
            {
                using (var transaction = _session.BeginTransaction())
                {
                    usuario = _session.Query<Usuario>().FirstOrDefault(x => x.Id == Id_Usuario);
                }
            }
            catch (Exception)
            {
                throw;
            }
            return usuario;
        }

        /// <summary>
        /// Deuelve todos los Usuarios correspondientes a un Tipo
        /// </summary>
        /// <param name="tipo"></param>
        /// <returns></returns>
        public List<Usuario> ObtenerUsuariosPorTipo(string tipo)
        {
            var lista = new List<Usuario>();
            try
            {
                using (var transaction = _session.BeginTransaction())
                {
                    lista = _session.Query<Usuario>()
                            .Where(x => x.Tipo.Nombre.ToUpper() == tipo)
                            .OrderBy(x => x.NombreUsuario)
                            .ToList();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return lista;
        }

        /// <summary>
        /// Deuelve todos los Usuarios correspondientes a una Categoría
        /// </summary>
        /// <param name="categoria"></param>
        /// <returns></returns>
        public List<Usuario> ObtenerUsuariosPorCategoria(string categoria)
        {
            var lista = new List<Usuario>();
            try
            {
                using (var transaction = _session.BeginTransaction())
                {
                    lista = _session.Query<Usuario>()
                            .Where(x => x.Categoria.Nombre.ToUpper() == categoria.ToUpper())
                            .OrderBy(x => x.NombreUsuario)
                            .ToList();
                }
            }
            catch (Exception)
            {
                throw;
            }
            return lista;
        }

        #endregion
    }
}
